package client;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Calendar;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import DTO.AnnonceDTO;

/**
 * Classe décrivant la fenêtre "Poster une annonce". 
 * 
 * @author Julien Dubois
 * @version 1.0 (Mai 2012)
 * 
 */
@SuppressWarnings("serial")
public class ClientAnnoncePosterAnnonce extends JFrame implements ActionListener, WindowListener 
{

	//DECLARATION DES VARIABLES DE LA CLASSE 
	
	/**
	 * Panel général de fond.
	 */
	private JPanel grandPanel ;
	
	/**
	 * Panel principal contenant nos éléments.
	 */
	private JPanel panel;
	
	/**
	 * Layouts choisis pour agencer nos éléments.
	 */
	private BorderLayout borderLayoutPrincipal;
	private FlowLayout flowLayout;
	
	/**
	 * TextField's de la fenêtre.
	 */
	private JTextField tfTitre, tfDepartement;
	
	/**
	 * TextArea's de la fenêtre.
	 */
	private JTextArea taCorps ;
	
	/**
	 * Bouton's de la fenêtre.
	 */
	private JButton envoyer, annuler ;

	/**
	 * Label's de la fenêtre.
	 */
	private JLabel erreurTitre, erreurType, erreurDepartement  ;

	/**
	 * ComboBox de la fenêtre.
	 */
	@SuppressWarnings("rawtypes") // a laisser comme ça pour ne pas créer de problème de comptabilité entre Java 1.6 et 1.7
	private JComboBox combo;

	/**
	 * Booleen de notre fenêtre.
	 */
	//le booleen quitter sert à assurer proprement la fermeture de la connexion avec le serveur. 
	private boolean quitter = true;
	
	/**
	 * Instance de l'annonce à poster.
	 */
	private AnnonceDTO annonce ;

	
	
	// CONSTRUCTEUR DE LA FENETRE
	
	/**
	 * Constructeur par défaut.
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" }) // a laisser comme ça pour ne pas créer de problème de comptabilité entre Java 1.6 et 1.7
	public ClientAnnoncePosterAnnonce()
	{
		/*
		 * Va nous pemettre d'utiliser this.dispose pour disposer d'un fenêtre quand on en a plus besoin (pour la fermer)
		 * Ce bout de code sert à fermer la connexion avec le serveur proprement (pas de message d'erreur) lorsque l'on clique sur la croix rouge.
		 */
		this.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent arg0)
			{
				if(quitter)
				{
					ClientCommunication.getInstance().fermerConnexion();
				}
			}
		});
		
		
		this.setTitle("Petites Annonces - Poster");
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.setVisible(true);
		
		//on définit la taille de la fenêtre
		//600x660 pour respecter au mieux la taille de l'image d'accueil.
		this.setSize(600,660);
		
		
		//On n'empêche le redimensionnement.
		this.setResizable(false);
		
		
		//On colore le panel dans un gris sympathique et soyeux.
		grandPanel = new JPanel() ;
		grandPanel.setBackground(Color.LIGHT_GRAY);
		this.setContentPane(grandPanel);
		
		
		//BorderLayout pour agencer nos éléments.
		borderLayoutPrincipal = new BorderLayout();
		this.setLayout(borderLayoutPrincipal);
		
		
		
		//PERSONNALISATION DE LA FENETRE A PARTIR DICI 
		
		
		//FlowLayout pour agencer nos éléments.
		flowLayout = new FlowLayout();

		
		//Association Layout <-> Panel + CENTER + couleur.
		panel = new JPanel();
		panel.setLayout(flowLayout);
		this.getContentPane().add(panel, BorderLayout.CENTER);
		panel.setBackground(Color.LIGHT_GRAY);

		
		
		// ON DISPOSE DES ELEMENTS DE NOTRE FENETRE DANS panel.

		
		//Espace pour agencer nos éléments.	
		JLabel espacevide0 = new JLabel();
		espacevide0.setPreferredSize(new Dimension(20, 30));
		panel.add(espacevide0);
		

		//On ajoute le login.
		JLabel label1 = new JLabel("Titre : ");
		panel.add(label1);		
		

		//Textfield du titre.
		tfTitre = new JTextField();
		tfTitre.setPreferredSize(new Dimension(400, 20));
		panel.add(tfTitre);	
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide1 = new JLabel();
		espacevide1.setPreferredSize(new Dimension(100, 30));
		panel.add(espacevide1);
		
		//Message d'erreur s'il n'y a pas de titre.
		erreurTitre = new JLabel("Vous devez rentrer un titre");
		erreurTitre.setForeground(Color.lightGray);
		panel.add(erreurTitre);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide11 = new JLabel();
		espacevide11.setPreferredSize(new Dimension(260, 30));
		panel.add(espacevide11);
		
		//message d'erreur s'il n'y a pas de type
		erreurType = new JLabel("Vous devez choisir un type d'annonce");
		erreurType.setForeground(Color.lightGray);
		panel.add(erreurType);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide12 = new JLabel();
		espacevide12.setPreferredSize(new Dimension(200, 30));
		panel.add(espacevide12);
		

		//ComboBox contenant les options de tri.
		combo = new JComboBox();
		combo.setPreferredSize(new Dimension(180, 20));
		combo.addItem("Type d'annonce");
		combo.addItem("Offres d'Emplois/Stages");
		combo.addItem("Ventes Objets/Services");
		panel.add(combo);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide2 = new JLabel();
		espacevide2.setPreferredSize(new Dimension(360, 30));
		panel.add(espacevide2);

		
		//On ajoute le département.
		JLabel label2 = new JLabel("Departement : ");
		panel.add(label2);
		
		
		//TextField du département. 
		tfDepartement = new JTextField();
		tfDepartement.setPreferredSize(new Dimension(80, 20));
		panel.add(tfDepartement);
		
		
		//Zone pour afficher l'erreur département.
		erreurDepartement = new JLabel("Le département n'est pas valide ! ");
		erreurDepartement.setForeground(Color.lightGray);
		erreurDepartement.setPreferredSize(new Dimension(370, 30));
		panel.add(erreurDepartement);
		
			
		//Label pour la consigne.
		JLabel label3 = new JLabel("Entrer le texte de votre annonce : ");
		panel.add(label3);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide4 = new JLabel();
		espacevide4.setPreferredSize(new Dimension(350, 30));
		panel.add(espacevide4);
		
		
		//TextArea pour le corps du message.
		taCorps = new JTextArea() ;
		taCorps.setPreferredSize(new Dimension(555, 300));
		panel.add(taCorps);
		

		//Espace pour agencer nos éléments.
		JLabel espacevide5 = new JLabel();
		espacevide5.setPreferredSize(new Dimension(600, 30));
		panel.add(espacevide5);
		

		//Bouton Envoyer
		envoyer = new JButton("Envoyer");
		envoyer.setPreferredSize(new Dimension(150, 25));
		panel.add(envoyer);
		envoyer.addActionListener(this);
		
		
		//Bouton Annuler
		annuler = new JButton("Annuler");
		annuler.setPreferredSize(new Dimension(150, 25));
		panel.add(annuler);
		annuler.addActionListener(this);
		
		
		//Espace pour agencer nos éléments.
		JLabel espacevide6 = new JLabel();
		espacevide6.setPreferredSize(new Dimension(500, 30));
		panel.add(espacevide6);
	}
	
	
	//ACTIONS SUR LES BOUTONS
	

	
	public void actionPerformed(ActionEvent e)
	{
		Object event = e.getSource();
		
		//Clique sur le bouton envoyer.
		if (event == envoyer)
		{
			erreurType.setForeground(Color.lightGray);
			erreurTitre.setForeground(Color.lightGray);
			
			// Condition sur le titre (true si renseigné).
			boolean cdt1 = false ;
			// Condition sur le type d'annonce (true si selectionné).
			boolean cdt2 = false ;
			// Flag est true si cdt1 et cdt2 sont "true", il déclenche l'ajout de l'annonce dans la BDD.
			boolean flag = false ;
			
			
			//Permet de savoir sur quelle entrée de la ComboBox l'user a cliqué.
	        class ItemAction implements ActionListener
	        {
	        	public void actionPerformed(ActionEvent e)
	        	{
	        		System.out.println("ActionListener : action sur " + combo.getSelectedItem());
	            }               
	        }
			
			
			//ajout du listener grâce à la classe déclarée juste au dessus.
	        ItemAction itemAction = new ItemAction();
			combo.addActionListener(itemAction);
			
			
			//Tests sur le formulaire.
			if (tfTitre.getText().equals(""))
			{
				erreurTitre.setForeground(Color.red);
			}
			else
			{
				cdt1 = true ;
				erreurTitre.setForeground(Color.lightGray);
			}

			
			if (combo.getSelectedItem().equals("Type d'annonce"))
			{
				erreurType.setForeground(Color.red);
			}
			else 
			{
				cdt2 = true ; 
				erreurType.setForeground(Color.lightGray);
			}

			
			if (cdt1 == true && cdt2 == true)
			{
				flag = true ;
			}

			
			if (flag == true)
			{
				//la date du jour
				Calendar cal = Calendar.getInstance();
				java.sql.Date date = new java.sql.Date( cal.getTime().getTime() );
				
				
				//en fonction du choix dans la listeBox
				Boolean emploisStages = null ;
				Boolean objetServices = null ;
				if (combo.getSelectedItem().equals("Offres d'Emplois/Stages"))
				{
					emploisStages = true ; 
					objetServices = false ; 
				}
				if (combo.getSelectedItem().equals("Ventes Objets/Services"))
				{
					emploisStages = false ; 
					objetServices = true ; 					
				}
				
				//ajout dans la BDD.
				int idVendeur = ClientCommunication.getInstance().getVendeurStocke().getId();
				
				// On va vérifier que tous les paramètres sont bons
				// On commence par les départements
				if(ClientCommunication.verifierDepartement(tfDepartement.getText()))
				{
					// On vérifie pour le titre
					if(ClientCommunication.verifierTitre(tfTitre.getText()))
					{
						// Une fois que tout est bon, on instancie et on envoie
						annonce = new AnnonceDTO(1, idVendeur, date, tfTitre.getText(), taCorps.getText(), tfDepartement.getText(), emploisStages, objetServices);
		 				
						ClientCommunication.getInstance().ajouterAnnonce(annonce);
						ClientCommunication.getInstance().setAnnonceStocke(annonce);
						

						//Appel de la fenêtre {@link ClientFenetreUneFoisConnecte}.
						quitter = false;
						ClientCommunication.getInstance().creerFenetre(panel, "fenetreUneFoisConnecte");
						this.dispose();
					}
					// Si le titre n'est pas bon, on le dit
					else
					{
						erreurTitre.setForeground(Color.red);
					}
				}
				// Si le département n'est pas bon, on le dit
				else
				{
					erreurDepartement.setForeground(Color.red);
				}
			}
		}
		
		//Clique sur le bouton Annuler.
		if (event == annuler)
		{
			//Appel de fenêtre {@link ClientFenetreUneFoisConnecte}.
			quitter = false;
			ClientCommunication.getInstance().creerFenetre(panel, "fenetreUneFoisConnecte");
			this.dispose();
		}
		
	}

	
	
	//Méthodes de implémentées de WindowListener, on ne les utilisent pas.
	
	@Override
	public void windowActivated(WindowEvent e)
	{

	}

	@Override
	public void windowClosed(WindowEvent e)
	{
		
	}

	@Override
	public void windowClosing(WindowEvent e)
	{
		
	}

	@Override
	public void windowDeactivated(WindowEvent e)
	{
		
	}

	@Override
	public void windowDeiconified(WindowEvent e)
	{
		
	}

	@Override
	public void windowIconified(WindowEvent e)
	{
		
	}

	@Override
	public void windowOpened(WindowEvent e)
	{
		
	}

}
